#!/bin/bash

#******************************************************************************#
#                                                                              #
# LoguearT                                                                     #
#                                                                              #
#******************************************************************************#

# Permite grabar un mensaje en el log de un comando.

#******************************************************************************#
#                                                                              #
# Funciones auxiliares                                                         #
#                                                                              #
#******************************************************************************#

uso()
{
	echo -e "Uso:

./LoguearT comando tipo_mensaje { mensaje | --id_msj=identificador_mensaje [ parametro_mensaje_1 parametro_mensaje_2 ... parametro_mensaje_n ] }

Donde:

comando:
	Nombre del comando para el cual se desea grabar un mensaje en su log.
tipo_mensaje:
	Tipo de mensaje que se desea grabar. Valores validos: I, A, E, SE.
mensaje:
	Texto del mensaje que se desea grabar. Cada caracter '-' que aparezca en el sera reemplazado por un '_'.
identificador_mensaje:
	Identificador del mensaje que se desea grabar. Consultar en el archivo 'mensajes' los mensajes disponibles y sus respectivos identificadores y parametros.
parametro_mensaje_i:
	Valor del parametro de mensaje i. No puede contener el caracter '|'.

Ejemplo:

./LoguearT comando I \"Mensaje informativo.\"
./LoguearT comando I --id_msj=M0P
./LoguearT comando I --id_msj=M1P valor_parametro_1
./LoguearT comando I --id_msj=M2P valor_parametro_1 valor_parametro_2"
}

uso_tipo_mensaje()
{	
	echo "Tipos de mensaje válidos: I, A, E, SE."
}

# uso: grabar_mensaje comando tipo_mensaje mensaje log
grabar_mensaje()
{
	# fecha hora-usuario-comando-tipo_mensaje-mensaje
	echo "$(date +%Y/%m/%d) $(date +%T)-$USER-$1-$2-$3" >> "$4"
}

#******************************************************************************#
#                                                                              #
# Main                                                                         #
#                                                                              #
#******************************************************************************#

#------------------------------------------------------------------------------#

# verifico que se hayan pasado los parametros obligatorios
if [ $# -lt 3 ]
then
	echo "Faltan parámetros obligatorios."
	uso
	exit 1
fi

# mapeo parametros a variables
comando=$1
tipo_mensaje=$2
mensaje=$3
opcion=`expr substr "$mensaje" 1 9`

# verifico que el valor del parametro tipo_mensaje sea valido
case "$tipo_mensaje" in
	( I | A | E | SE );;
	( * ) echo "El tipo de mensaje es inválido."; uso_tipo_mensaje; exit 1;;
esac

# verifico que si el valor del parametro tipo_mensaje es E o SE entonces se haya suministrado la opcion "--id_msj"
if [ $tipo_mensaje == "E" -o $tipo_mensaje == "SE" ]
then
	if [ "$opcion" != "--id_msj=" ]
	then
		echo "Si el tipo de mensaje es E o SE, el mensaje se debe suministrar a traves de su identificador (opción --id_msj)."
		exit 1
	fi
fi

# si se suministro la opcion "--id_msj" entonces obtengo el mensaje del archivo mensajes
if [ "$opcion" == "--id_msj=" ]
then
	largo=`expr length "$mensaje"`
	id_mensaje=`expr substr "$mensaje" 10 $largo` 

	registro=`grep "^$id_mensaje|" mensajes`
	if [ -z "$registro" ]
	then
		echo "El identificador de mensaje es inválido."
		exit 1
	fi

	mensaje=`echo "$registro" | cut -d'|' -f2`
	cantidad_parametros_msj=`echo "$registro" | cut -d'|' -f3`
	(( cantidad_parametros_msj_pasados = $# - 3 ))
	if [ $cantidad_parametros_msj_pasados -lt "$cantidad_parametros_msj" ]
	then
		echo "La cantidad de parametros de mensaje suministrada es menor a la esperada. Se esperaban $cantidad_parametros_msj parametro(s) de mensaje y se suministraron $cantidad_parametros_msj_pasados".
		exit 1
	fi

	# reemplazo las marcas __i__ en el texto del mensaje por los parametros del mensaje
	shift 3
	for (( i=1 ; i <= $cantidad_parametros_msj ; i++ ))
	do
		# verifico que el parametro de mensaje no contengan el caracter '|'
		# los parametros de mensaje no pueden contener el caracter '|' porque ese caracter se utiliza como separador en el comando sed
		parametro_contiene_caracter_invalido=`echo "$1" | grep -c '|'`
		if [ $parametro_contiene_caracter_invalido -ne 0 ]
		then
			echo "El parametro de mensaje \"$1\" contiene el caracter inválido '|'."
			exit 1
		fi

		mensaje=`echo $mensaje | sed "s|_"$i"_|$1|"`
		shift 1
	done
fi

#------------------------------------------------------------------------------#

# determino el nombre del archivo de log (11)

# determino la extension del archivo de log (12)
if [ -z "$LOGEXT" ]
then
	extension=".log"
else
	extension="$LOGEXT"
fi

nombre_log="$comando$extension"

#------------------------------------------------------------------------------#

# determino el archivo de log

# determino el directorio donde se encuentra el archivo de log (10)
if [ -z "$LOGDIR" ]
then
	mkdir "$GRUPO/logdir" -p

	directorio_log="$GRUPO/logdir"
else
	directorio_log="$LOGDIR"
fi

log="$directorio_log/$nombre_log"

#------------------------------------------------------------------------------#

# grabo el mensaje en el log

# sustituyo cada caracter '-' que aparezca en el mensaje por un caracter '_'
# el mensaje no puede contener el caracter '-' porque ese caracter es el separador de campos del registro del archivo de log
mensaje=`echo "$mensaje" | sed "s/-/_/g"`

# si la longitud del mensaje es superior a 140 caracteres lo trunco
longitud_mensaje=`expr length "$mensaje"`
if [ $longitud_mensaje -gt 140 ]
then
	mensaje=`expr substr "$mensaje" 1 137`
	mensaje=`echo "$mensaje..."`
fi

grabar_mensaje "$comando" "$tipo_mensaje" "$mensaje" "$log"

#------------------------------------------------------------------------------#

# si el archivo de log supero el tamaño maximo que puede tener lo trunco (14)

# determino el tamaño maximo que puede tener un archivo de log
if [ -z $LOGSIZE ]
then
	tamanio_maximo_log="102400"
else
	tamanio_maximo_log=$(( $LOGSIZE * 1024 )) # LOGSIZE esta en kB
fi

tamanio_log=`stat "$log" --format=%s`

if [ $tamanio_log -gt $tamanio_maximo_log ]
then
	# reduzco el tamaño del archivo de log
	cantidad_lineas=`wc -l "$log" | cut -d' ' -f1`
	cantidad_lineas=`echo "($cantidad_lineas * 0.5) / 1" | bc`
	tail --lines=$cantidad_lineas "$log" > __AUX__
	mv __AUX__ "$log"

	# grabo en el log el mensaje "Log Excedido."
	grabar_mensaje "LoguearT.sh" "I" "Log Excedido." "$log"

	echo "Log $nombre_log excedido. Se truncó el archivo."
fi

#------------------------------------------------------------------------------#

exit 0
